package cn.bugstack.ai.domain.agent.service.execute.auto;

import cn.bugstack.ai.domain.agent.model.entity.AutoAgentExecuteResultEntity;
import cn.bugstack.ai.domain.agent.model.entity.ExecuteCommandEntity;
import cn.bugstack.ai.domain.agent.service.IExecuteStrategy;
import cn.bugstack.ai.domain.agent.service.execute.auto.step.factory.DefaultAutoAgentExecuteStrategyFactory;
import cn.bugstack.wrench.design.framework.tree.StrategyHandler;
import com.alibaba.fastjson.JSON;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;

/**
 * Auto Agent 自动执行策略
 * 
 * 【执行流程第三层：执行策略】
 * 职责：
 * 1. 通过工厂类获取责任链处理器（RootNode → Step1 → Step2 → Step3 → Step4）
 * 2. 创建并初始化动态上下文（DynamicContext），用于在 Step 之间传递数据
 * 3. 执行责任链，每个 Step 按顺序执行并通过 emitter 推送进度
 * 4. 发送完成标识给前端
 * 
 * 流程位置：
 * AgentDispatchService → AutoAgentExecuteStrategy → 责任链（Step1~4）
 * 
 * 设计模式：责任链模式 + 工厂模式
 * 
 * @author xiaofuge bugstack.cn @小傅哥
 *         2025/8/5 09:49
 */
@Slf4j
@Service("autoAgentExecuteStrategy") // Bean 名称必须与数据库中的 strategy 字段一致
public class AutoAgentExecuteStrategy implements IExecuteStrategy {

    /**
     * Auto Agent 执行策略的工厂类
     * 负责创建和组装责任链（RootNode → Step1 → Step2 → Step3 → Step4）
     */
    @Resource
    private DefaultAutoAgentExecuteStrategyFactory defaultAutoAgentExecuteStrategyFactory;

    /**
     * 执行 Auto Agent 策略
     * 
     * 执行流程：
     * 1. 从工厂获取责任链处理器
     * 2. 创建动态上下文并初始化
     * 3. 执行责任链（RootNode → Step1 → Step2 → Step3 → Step4）
     * 4. 发送完成标识
     * 
     * @param executeCommandEntity 执行命令实体（用户输入参数）
     * @param emitter              SSE 流式响应对象（用于实时推送）
     * @throws Exception 如果执行过程中出现异常
     */
    @Override
    public void execute(ExecuteCommandEntity executeCommandEntity, ResponseBodyEmitter emitter) throws Exception {
        // ========== 第一步：获取责任链处理器 ==========
        // 从工厂类获取已组装好的责任链
        // 返回的是 RootNode，它会依次调用 Step1 → Step2 → Step3 → Step4
        StrategyHandler<ExecuteCommandEntity, DefaultAutoAgentExecuteStrategyFactory.DynamicContext, String> executeHandler = defaultAutoAgentExecuteStrategyFactory
                .armoryStrategyHandler();

        // ========== 第二步：创建动态上下文并初始化 ==========
        // DynamicContext 是一个"共享记事本"，在各个 Step 之间传递数据
        DefaultAutoAgentExecuteStrategyFactory.DynamicContext dynamicContext = new DefaultAutoAgentExecuteStrategyFactory.DynamicContext();

        // 初始化上下文字段
        dynamicContext.setMaxStep(executeCommandEntity.getMaxStep() != null ? executeCommandEntity.getMaxStep() : 3); // 最大步骤数（默认
                                                                                                                      // 3）
        dynamicContext.setExecutionHistory(new StringBuilder()); // 执行历史记录
        dynamicContext.setCurrentTask(executeCommandEntity.getMessage()); // 当前任务（用户消息）
        dynamicContext.setValue("emitter", emitter); // 将 emitter 存入上下文，供各 Step 使用

        // ========== 第三步：执行责任链 ==========
        // apply() 会触发整个责任链的执行：
        // RootNode.apply() → Step1.apply() → Step2.apply() → Step3.apply() →
        // Step4.apply()
        // 每个 Step 执行时都会通过 emitter 发送 SSE 消息给前端
        String apply = executeHandler.apply(executeCommandEntity, dynamicContext);
        log.info("测试结果:{}", apply); // 记录执行结果

        // ========== 第四步：发送完成标识 ==========
        // 告诉前端"所有步骤都执行完了"
        try {
            AutoAgentExecuteResultEntity completeResult = AutoAgentExecuteResultEntity
                    .createCompleteResult(executeCommandEntity.getSessionId());
            // 发送SSE格式的数据：data: {...}\n\n
            String sseData = "data: " + JSON.toJSONString(completeResult) + "\n\n";
            emitter.send(sseData);
        } catch (Exception e) {
            log.error("发送完成标识失败：{}", e.getMessage(), e);
        }
    }

}
